Slice (Go)
Arrayへの参照
code:go
slice := make([]string, 3) // lengthは3
slice100 = "a" // lengthを超えたアクセスはpanic slice = append(slice, "a") // lengthを拡張
a := slice3 // 拡張したのでpanicにならない capacityはsliceが指すarrayの初めから終わりまでの数
code:go
slice := make([]int, 0, 3) // length 0, capacity 3 3要素分のメモリを確保している
slice = append(slice, 1, 2, 3) // 再確保されない
省略するとcapacityはlengthと同サイズになる
Deleteは存在しないが↓のような方法でできる
capacityをうまく使う必要がある
lengthが足りない状態でappendすると、メモリの再確保&コピーが行われる(パフォーマンス劣化)
capacityを無駄にたくさんとるとGCのコストで遅くなる&無駄にメモリがくう
最適capacityの判定はむずい
container/listにListがあるが、型エラーしやすい
GoにGenericsがはいるまではめんどい
対処:testing/quickなどを使って大量のサンプルでpanicしないことを確認する
sleceの仕組み
連続したメモリ領域を要求する
足りなくなると新しい領域が確保され、コピーされる
code:go
slice := make([]string, 0) // lengthは0なので確保されるメモリ領域が小さい
slice = append(slice, "a") // 入らないので、メモリを再確保してコピーする
参考